PHLEGM v8 compiler duration rolling average - checkpoint 30

The compiler UI estimates Duration and the countdown ETA from the arithmetic
mean of the most recent N successful builds (exit code 0, not cancelled).
N is data-driven: tools/Compiler-UI.json -> progress.knownDuration.goodBuildHistoryCount.
Default N is 5. The accepted range is 1..10000.

Durations are milliseconds and retained oldest-to-newest in persistent compiler
settings under buildHistory.recentGoodDurationsMilliseconds. The collection is
always capped to N most recent successful builds; after lowering N, existing
history is trimmed on the next launch. Build failures and cancellations do not
append, replace, or erase good samples. No more than N durations are persisted.

Until N successful builds exist, the average is taken over however many exist.
On build start, Duration/ETA/progress lock their basis to that mean, so the
current build cannot change its own estimate mid-run. The ETA counts down to
00:00.000 and the progress never reports completion before process success.
Unknown Duration is used only when no successful duration sample exists.
Failures and cancellations preserve the rolling mean and do not suppress its use.

Existing checkpoint-29 settings with only lastGoodDurationMilliseconds migrate
that lone last-good result as the first history sample. Legacy scalar is kept
for older external integrations/diagnostics; the rolling mean is computed from
the bounded history, not from the legacy scalar.

All compiler UI logic remains shared and project-neutral. No Python scripts,
runtime dependencies, or validators are shipped.
